package OOP2;

public class StaticThingDemo {
    static class Person {

        // 实例字段（每个实例独立）在每个实例中都有自己的一个独立“空间”
        private String name;
        private int age;

        // 静态字段：一个类的所有实例共享的字段,只有一个共享“空间”，所有instance实例都会共享该字段，实际上是属于class的字段
        private static int population = 0;

        // 常量静态字段（大写+下划线命名）
        public static final int MAX_AGE = 150;

        static {
            System.out.println("静态初始化块（类加载时执行且仅执行一次）");
        }

        public Person(String name, int age) {

            validateAge(age);
            this.name = name;
            this.age = age;

            incrementPopulation(); // 通过方法修改静态字段


        }

        // 实例方法
        public void introduce() {
            System.out.printf("%s（%d岁）向您问好%n", name, age);
        }

        // 静态方法：可以通过类名直接调用，不需要实例变量
            // 静态方法不能访问实例字段，只能访问静态字段
            // 常用于工具类和辅助方法
        public static void printPopulation() {
            System.out.println("当前人口总数：" + population);
        }

        // 封装静态字段访问
        private static synchronized void incrementPopulation() {
            population++;
        }

        public static synchronized void resetPopulation() {
            population = 0;
        }

        // 参数校验方法
        private void validateAge(int age) {
            if (age < 0 || age > MAX_AGE) {
                throw new IllegalArgumentException("无效年龄值：" + age);
            }
        }
    }

    /**
     * 性别接口常量定义
     * 接口特性：
     * 1. 所有字段默认public static final
     * 2. Java 8+支持静态方法
     */
    public interface Gender {

        // 接口字段只能是public static final类型，所以我们可以把这些修饰符都去掉，上述代码可以简写,编译器会自动加上public static final
        int MALE = 1;
        public static final int FEMALE = 2;
        String DESC = "性别标识接口";

        // Java 8+ 允许静态方法
        static String getDescription() {
            return DESC + " | 版本：1.2.0";
        }

        static String parseCode(int code) {
            switch (code) {
                case MALE: return "男性";
                case FEMALE: return "女性";
                default: return "未知";
            }
        }
    }

    public void demonstrateStaticFeatures() {
        // 首次访问静态字段触发类加载
        System.out.println("\n物种信息：" + Person.MAX_AGE);

        // 创建实例
        Person alice = new Person("Alice", 28);
        Person bob = new Person("Bob", 32);

        // 实例方法
        alice.introduce();
        bob.introduce();

        // 正确访问静态方法
        Person.printPopulation();

        // 接口常量使用
        System.out.println("\n=== 接口常量演示 ===");
        System.out.println("性别代码解析：");
        System.out.println("1 -> " + Gender.parseCode(1));
        System.out.println("2 -> " + Gender.parseCode(2));
        System.out.println(Gender.getDescription());
    }

    public static void main(String[] args) {
        StaticThingDemo demo = new StaticThingDemo();

        // 重置静态字段（测试用）
        Person.resetPopulation();

        demo.demonstrateStaticFeatures();

        // 测试异常情况
        try {
            new Person("Error", 200);
        } catch (IllegalArgumentException e) {
            System.out.println("\n异常捕获测试：");
            System.out.println(e.getMessage());
        }

    }

}





